<?php

class My_Acl{
    public function hasIdentity($request){
        $helper_redirector = new Zend_Controller_Action_Helper_Redirector();
        $auth = Zend_Auth::getInstance();
        if($request->getModuleName() == 'it'){
            $auth_session = 'Zend_Auth_CMDB_IT';
        }else{
            $auth_session = 'Zend_Auth_CMDB';
        }
        
        $auth->setStorage(new Zend_Auth_Storage_Session($auth_session)); 
        if (!$auth->hasIdentity()) {
            if($request->getModuleName() == 'it'){
                $helper_redirector->gotoUrl('/it/auth');
            }else{
                $helper_redirector->gotoUrl('/default/auth');
            }
        }
        return $auth;
    }
    public function checkAllowed($request){
        $helper_redirector = new Zend_Controller_Action_Helper_Redirector();
        $auth = Zend_Auth::getInstance();
        if($request->getModuleName() == 'it'){
            $auth_session = 'Zend_Auth_CMDB_IT';
        }else{
            $auth_session = 'Zend_Auth_CMDB';
        }
        
        $auth->setStorage(new Zend_Auth_Storage_Session($auth_session)); 
        if ($auth->hasIdentity()) {
            if(!$this->isAllowed($auth->getIdentity(), $request)){
                if($request->getModuleName() == 'it'){
                    $helper_redirector->gotoUrl('/it/error/accessdenied');
                }else{
                    $helper_redirector->gotoUrl('/default/error/accessdenied');
                }
            }
        } else {
            if($request->getModuleName() == 'it'){
                $helper_redirector->gotoUrl('/it/auth');
            }else{
                $helper_redirector->gotoUrl('/default/auth');
            }
        }
        return $auth;
    }
    public function isAllowed($user, $request)
    {
        $db = Zend_Db_Table::getDefaultAdapter();
        
        // lấy danh sách các resource của user 
        $query = $db->select()
                    ->from(array('p'=>'roles_privilege'), array('p.roleId', 'p.resourceId'))
                    ->where('p.roleId IN (SELECT u.roleId FROM users_roles u WHERE u.userId = '.$user['userId'].')');
        $resource_list = $db->fetchAll($query);
        $temp = array();
        foreach($resource_list as $row){
            $temp = array_merge($temp, json_decode($row['resourceId']));
        }
        $temp           = array_unique($temp);
        $resource_list  = array_values($temp);
        
        // kiểm tra request của user thuộc resource nào
        $query = $db->select()
                    ->from(array('r'=>'resources'), array('r.id'))
                    ->where('r.moduleName = ?', $request->getModuleName())
                    ->where('r.controllerName = ?', $request->getControllerName())
                    ->where('r.actionName = ?', $request->getActionName());
        $resource_check = $db->fetchRow($query);
        
        // kiểm tra request của user có nằm trong danh sách các resource của user ko (kt có quyền thao tác trên request này ko)
        if(in_array($resource_check['id'], $resource_list) || !isset($resource_check['id']))
            return true;
        else
            return false;
    }
	
	public function listAllowed($user)
    {
        $db = Zend_Db_Table_Abstract::getDefaultAdapter();
        
        // Lấy danh sách các resource của user (json)
        $query = $db->select()
                    ->from(array('p'=>'roles_privilege'), array('p.roleId', 'p.resourceId'))
                    ->where('p.roleId IN (SELECT u.roleId FROM users_roles u WHERE u.userId = '.$user['userId'].')');
        $resource_list = $db->fetchAll($query);
        $temp = array();
        foreach($resource_list as $row){
            $temp = array_merge($temp, json_decode($row['resourceId']));
        }
        $temp           = array_unique($temp);
        $resource_list  = array_values($temp);
        $resource_list  = json_encode($resource_list);
        $resource_list  =  str_replace(array('[',']'), array('(',')'), $resource_list);
        
        // Lấy danh sách các resource của user  (record)
        $query = $db->select()
                    ->from(array('r'=>'resources'), array('r.id','r.moduleName','r.controllerName','r.actionName'))
                    ->where('r.id IN '.$resource_list)
                    ->order('r.id ASC');
                                 
		$row = $db->fetchAll($query);
		return $row;
    }
    
}
